{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "nxtGCfvgqHrr"
   },
   "outputs": [],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "import os\n",
    "import shutil\n",
    "import datetime\n",
    "import gc\n",
    "from tqdm import tqdm\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "sns.set(style='whitegrid')\n",
    "\n",
    "\n",
    "import scipy\n",
    "from scipy import hstack\n",
    "\n",
    "\n",
    "from sklearn.metrics import mean_squared_error as mse\n",
    "from math import sqrt\n",
    "from sklearn.linear_model import Ridge\n",
    "from sklearn.svm import SVR\n",
    "from sklearn.ensemble import RandomForestRegressor\n",
    "from lightgbm import LGBMRegressor\n",
    "\n",
    "from sklearn.model_selection import RandomizedSearchCV \n",
    "from scipy.stats import randint as sp_randint\n",
    "from scipy.stats import uniform\n",
    "from sklearn.feature_selection.univariate_selection import SelectKBest, f_regression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "Cvt8BoiMqHr7"
   },
   "source": [
    "**Loading data**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 34
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 705,
     "status": "ok",
     "timestamp": 1584173344032,
     "user": {
      "displayName": "Arun Singh",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GiLB1oZWi0vJw-6NUEFnpDZhxuDlv90nmX88O0y-A=s64",
      "userId": "01425536422013553450"
     },
     "user_tz": -330
    },
    "id": "rDIreBF5s4Ff",
    "outputId": "6d70d503-c142-4486-944f-82d6e4d6da72"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"
     ]
    }
   ],
   "source": [
    "from google.colab import drive\n",
    "drive.mount('/content/drive')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "I7MVOrHCtyXx"
   },
   "outputs": [],
   "source": [
    "os.chdir('/content/drive/My Drive/Colab Notebooks/MercariCS')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 34
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 8697,
     "status": "ok",
     "timestamp": 1584173356944,
     "user": {
      "displayName": "Arun Singh",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GiLB1oZWi0vJw-6NUEFnpDZhxuDlv90nmX88O0y-A=s64",
      "userId": "01425536422013553450"
     },
     "user_tz": -330
    },
    "id": "SOEDMdj3qHsC",
    "outputId": "98e773cc-fe96-4de7-e418-b0b23d1fc6a7"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((1332967, 48049), (1332967,), (148108, 48049), (148108,))"
      ]
     },
     "execution_count": 4,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train = scipy.sparse.load_npz(\"train_final.npz\")\n",
    "y_train = np.load('y_train.npy')\n",
    "\n",
    "X_cv = scipy.sparse.load_npz(\"cv_final.npz\")\n",
    "y_cv = np.load('y_cv.npy')\n",
    "\n",
    "# X_test = scipy.sparse.load_npz(\"test_final.npz\")\n",
    "X_train.shape, y_train.shape, X_cv.shape, y_cv.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "jAgDOLvLqHsK"
   },
   "source": [
    "### 6.3. SVM Regression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "c57iSJliqHsM"
   },
   "source": [
    "#### Hyper parameter tuning using RandomizedSearchCV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 420
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 1786293,
     "status": "ok",
     "timestamp": 1584175700495,
     "user": {
      "displayName": "Arun Singh",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GiLB1oZWi0vJw-6NUEFnpDZhxuDlv90nmX88O0y-A=s64",
      "userId": "01425536422013553450"
     },
     "user_tz": -330
    },
    "id": "JBB5l7JOqHsQ",
    "outputId": "159bad1a-eb69-4890-b2c8-0c4418b75b6e"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RMSLE for C= 0.01 is 1.199926186837584\n",
      "RMSLE for C= 0.03 is 1.0373687259431916\n",
      "RMSLE for C= 0.1 is 0.7031124570842185\n",
      "RMSLE for C= 0.3 is 0.45763721721801703\n",
      "RMSLE for C= 1 is 0.9825724712557466\n",
      "RMSLE for C= 3 is 0.6889839235210923\n",
      "RMSLE for C= 10 is 0.7062493308619081\n"
     ]
    },
    {
     "data": {
      "image/png": "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\npP8HhE6NIPpiheYAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "c_param = [0.01, 0.03, 0.1, 0.3, 1, 3, 10]\n",
    "cv_rmsle_array=[]\n",
    "\n",
    "for i in c_param:\n",
    "    model = SVR(C=i, max_iter=200)\n",
    "    model.fit(X_train, y_train)\n",
    "    preds_cv = model.predict(X_cv)\n",
    "    cv_err = sqrt(mse(y_cv, preds_cv))\n",
    "    cv_rmsle_array.append(cv_err)\n",
    "\n",
    "    print('RMSLE for C=',i, 'is', cv_err)\n",
    "\n",
    "best_C = np.argmin(cv_rmsle_array)\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "ax.plot(c_param, cv_rmsle_array)\n",
    "ax.scatter(c_param, cv_rmsle_array)\n",
    "for i, txt in enumerate(np.round(cv_rmsle_array,3)):\n",
    "    ax.annotate((c_param[i],np.round(txt,3)), (c_param[i],cv_rmsle_array[i]))\n",
    "plt.title(\"Cross Validation Error for each C\")\n",
    "plt.xlabel(\"C\")\n",
    "plt.ylabel(\"Error\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "zu6lG2UGqHsp"
   },
   "source": [
    "#### Training and testing using best parameters "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 68
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 218811,
     "status": "ok",
     "timestamp": 1584176274717,
     "user": {
      "displayName": "Arun Singh",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GiLB1oZWi0vJw-6NUEFnpDZhxuDlv90nmX88O0y-A=s64",
      "userId": "01425536422013553450"
     },
     "user_tz": -330
    },
    "id": "77T0Nd4rPM94",
    "outputId": "2ad8c746-8201-4b31-bf5f-03a12a2cf465"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best C:  0.3\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "SVR(C=0.3, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma='scale',\n",
       "    kernel='rbf', max_iter=200, shrinking=True, tol=0.001, verbose=False)"
      ]
     },
     "execution_count": 9,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "best_C = c_param[best_C]\n",
    "print('Best C: ', best_C)\n",
    "model = SVR(C=best_C, max_iter=200)\n",
    "model.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 51
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 226034,
     "status": "ok",
     "timestamp": 1584176527418,
     "user": {
      "displayName": "Arun Singh",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GiLB1oZWi0vJw-6NUEFnpDZhxuDlv90nmX88O0y-A=s64",
      "userId": "01425536422013553450"
     },
     "user_tz": -330
    },
    "id": "RdPlu1R4qHs3",
    "outputId": "261219de-8581-41af-9217-01e08b950d3a"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train RMSLE: 0.44156303699190574\n",
      "Cross validation RMSLE:  0.45763721721801703\n"
     ]
    }
   ],
   "source": [
    "svr_preds_tr = model.predict(X_train)\n",
    "svr_preds_cv = model.predict(X_cv)\n",
    "print('Train RMSLE:', sqrt(mse(y_train, svr_preds_tr)))\n",
    "\n",
    "svr_rmsle = sqrt(mse(y_cv, svr_preds_cv))\n",
    "print(\"Cross validation RMSLE: \", svr_rmsle)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "ehHjX3aSqHtK"
   },
   "source": [
    "### 6.4. RandomForest Regression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "cnYeZWqdqHtL"
   },
   "source": [
    "#### Hyper parameter tuning using RandomizedSearchCV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 335
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 7333208,
     "status": "ok",
     "timestamp": 1584202148337,
     "user": {
      "displayName": "Arun Singh",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GiLB1oZWi0vJw-6NUEFnpDZhxuDlv90nmX88O0y-A=s64",
      "userId": "01425536422013553450"
     },
     "user_tz": -330
    },
    "id": "1nd5LxBCG_9c",
    "outputId": "e25e3eb0-ce48-44c6-e4cc-0a540c8a86ae",
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "RMSLE for N=10 is 0.487657647189664\t elapsed time:0:46:21.136700\n",
      "RMSLE for N=20 is 0.47260697582126654\t elapsed time:2:02:11.229545\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcYAAAEcCAYAAABdxxRgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdeVhV5f7//+dmCyiiqSiIUTn8FCkC\nERxKBSQNTGRrKihKWgoNDscmNT9HkbTQqPSEwzlY6U/RNI1ASbMQVDAixZGDZIlzCAgY4AC4Xd8/\nPOzYgYoyw/txXV6Xa6173eu+2eG7NezXUimKoiCEEEIIAAzqegBCCCFEfSKFUQghhChDCqMQQghR\nhhRGIYQQogwpjEIIIUQZUhiFEEKIMqQwiibFzc2Nn376CYB///vf/N///V+l2j6oQ4cO4e7u/lD7\nNgSKovDee+/Rp08fxowZU9fDuSs/Pz+2bt1a18MQDYwURnFPO3bs4MUXX8TBwYGBAwcydepUDh06\nVCdjCQsLY8KECeXW5+bmYmtry6lTpx6ov9dee40PPvigWsZmbW3NuXPndMtOTk7s3r27Wvou6+LF\ni1hbW+Pg4KD3Z+fOndV+rHtJTk7mwIED7Nu3j23bttXqsWtKUlIS1tbWLFy4UG/9+PHjiYiIqJtB\niTrRrK4HIOqvtWvXEhYWRlBQEAMHDsTQ0JD4+Hj27NmDk5NTufa3bt2iWbOa+0/Ky8uL5cuXc+HC\nBR577DHd+p07d9KjRw969OhRY8eubw4ePFipn7VWq0WtVt933b1U9LleunSJRx99FBMTk0r3c6/+\n6gsTExOioqKYOnUqVlZWdT0cUUfkjFFUqKCggM8++4wFCxbw/PPPY2JigqGhIW5ubsyZMweA0NBQ\nZs6cyTvvvEPv3r359ttvKS4u5oMPPmDgwIEMHDiQDz74gOLiYuDOmd2rr76Kk5MTffv2xdfXl9u3\nbwN3zgYHDRqEg4MD7u7uJCYmlhtTx44d6d+/P1FRUXrrIyMj0Wg0AJw/f56XXnqJfv360a9fP95+\n+23y8/MrnGNoaCjvvPOOXj+DBw+mX79+rF69Wq/t8ePH8fHxwcnJiYEDB/L+++/r5lV6FqvRaHRn\nb0lJSTg7O+v2P336NH5+fjg5OTF8+HD27Nmj2zZ37lyCgoIICAjAwcGBsWPHcv78+Up8SuXNnTuX\nwMBA/P396dWrF0lJSRWuKygoYPbs2fTv35/BgwezatUq3WcRERHBuHHj+PDDD+nXrx+hoaF6x9i6\ndSv//Oc/OXr0KA4ODnz22WcAfP311wwdOpS+ffvy2muvkZmZqdvH2tqajRs38vzzz/P8889XOPaj\nR48ybtw4nJyc8PLyIikpSbftm2++YdiwYTg4OPDcc8+xefNmvX1jYmLQaDT07t2bIUOGsH//ft22\nS5cuMW7cOBwcHHjllVfIzc2968+vVatWvPjii6xcubKSP3HRKClCVGDfvn2KjY2NUlJSctc2n332\nmfLkk08qP/74o6LVapUbN24oy5cvV8aOHatcuXJFycnJUXx8fJRly5YpiqIoH3/8sTJ//nyluLhY\nKS4uVg4ePKjcvn1bOX36tOLs7KxcvnxZURRFuXDhgnLu3LkKjxkVFaUMHTpUt3z69GnlqaeeUnJy\nchRFUZSzZ88qCQkJSlFRkZKTk6P4+voqixcv1rUfPHiwcuDAAd343377bUVRFOW3335TevXqpfzy\nyy9KUVGR8uGHHyo2Nja6tidOnFCOHDmilJSUKBcuXFA8PDyUtWvX6vrt0aOHcvbsWd3yzz//rAwa\nNEhRFEUpLi5WhgwZoqxevVopKipSfvrpJ6VXr17K6dOnFUVRlDlz5ih9+/ZVjh07ppSUlChvvfWW\nMmvWrArnf+HCBaVHjx53/VzmzJmj9O7dWzl06JCi1WqVmzdvVrju3XffVV577TWloKBAuXDhgvL8\n888rX3/9taIoivLNN98oNjY2yvr165WSkhLlxo0b5Y7zzTffKOPGjdMt//TTT0rfvn2VlJQUpaio\nSHn//fcVX19fvZ/P5MmTlby8vAr7u3z5stK3b19l7969ilarVRISEpS+ffvqPte4uDjl3Llzyu3b\nt5WkpCTFzs5OSUlJURRFUY4dO6b07t1bSUhIULRarXL58mXl999/VxRFUSZOnKg899xzSnp6unLj\nxg1l4sSJSkhISIU/u9LPLCsrS3FwcNB9PuPGjVO++eabCvcRjZOcMYoKXb16lbZt2973klevXr0Y\nMmQIBgYGNG/enB07djBt2jTMzMxo164d06ZNY/v27QA0a9aM7Oxs/vjjDwwNDXFyckKlUqFWqyku\nLub06dOUlJRgZWXF448/XuHxhg4dypUrVzh8+DAAUVFRDBo0iHbt2gHwxBNPMGDAAIyMjGjXrh0v\n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\nc4mMjNQVitIAZDc3N6ytrfVevgp3bmCHhIToXqxb2dDrUuvWrWPAgAH07t2b9957T/fy3HtZsWIF\n1tbW/PTTT7p1V69eZdasWXov+C0sLNRtP3nyJL6+vjg6OuLs7Kz3IteePXvSqlUrYmNjKz1uIYSo\nr2qtMJ45cwYfHx/c3d3x8fHh7Nmzd22bnp6Ovb09S5cu1dvfz88PjUbDsGHD9N4qfq9ttS0iIgIX\nFxe9d8717t2bjz76SO/1N6W2bNlCTEwMUVFRbN++nbi4uHJvJ7+b+Ph4wsLCWLduHXFxcVy8ePG+\n75A7f/48u3fvLjeW5cuXk5+fz549e4iJiSEnJ0fv5/j222/Tp08ffvnlF8LDw/nqq69ITk7WbR8x\nYgRbtmyp1LiFEKI+q7XCGBgYiK+vL7t378bX15cFCxZU2E6r1RIYGFguqDokJAR3d3eioqLYtm0b\nERERHD9+/L7batv+/fvp06ePbtnIyIjJkyfj5ORU4SPNkZGRvPLKK3Ts2BELCwtefvllvv3220od\nKzIykjFjxtC9e3ceeeQR3njjjfvuGxQUxDvvvFPuQaOLFy/y3HPPYWpqSqtWrRg6dCi///67bvul\nS5cYMWIEarWaxx9/nN69e+u9hLZfv366N2QIIURDViuFMScnh9TUVDw9PYE7r6hJTU0lNze3XNuw\nsDBcXV3p3Lmz3nqVSkVBQQEAN2/eRKVS6d7afq9tte3UqVN06dKl0u1/++03evbsqVvu2bMnv/32\n20Pta21tzZUrV8jLy6uw/a5duzAyMqrwpa4TJkxg7969/Pnnn/z555/s3r2bQYMG6bZPmjSJyMhI\nSkpKSE9P5+jRo3pPtVlYWNCsWTN5RY8QosGrladSS1+CqlargTvvgzM3NycjI0OvgKWlpZGQkMD6\n9etZtWqVXh/z5s3jtddeY9OmTeTn5zN79mzdu97uta2yUlJSqjjLO/Lz8zl79iwlJSXltpWUlHDq\n1Cm9N69fu3aNc+fOcevWLeDOz+r69escOnTovk975eXlcfnyZd0lzdI+kpKSyl0qvXHjBsHBwcyb\nN4/k5GSKioo4deqU7sk0rVZLTk6O7o3pTz31FDY2Nrq+LS0tWb16te5VQC+++CLdunXTu5xqZGTE\noUOHuHbt2gP9zBqSsvNt7JrSXEHmK/5Sb76uUVJSwvz58wkODtYV0LK2bNmCRqNh6tSpZGVl4efn\n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\nUV5++WX69u1L//79mTlzJllZWbr2iqIQEhJCv3796NevH8uWLXug+53r1q1jwIAB9O7dm/fee4/i\n4uL77rNixQqsra356aefdOuGDx+Og4OD7s+TTz7Ja6+9ppvTuHHj6NevH05OTvj4+OgFGXh7e7Nj\nxw5ycnLueVwpjEII0cCoVCoGOTzKqtnP4dLbiq9jTjHzk738N/3e/+CXFRERgYuLC82b33nS9c8/\n/8Tb25vY2Fji4uJo2bIl7733nq79li1biImJISoqiu3bt7Nv3z727NlTqWPFx8cTFhbGunXriIuL\n4+LFi3z22Wf33Of8+fPs3r2bDh066K3/7rvvOHLkCEeOHOHw4cN07NhRFwfasmVLPvzwQxITEzl4\n8CD+/v68/vrr3Lp1CwBjY2OcnZ2JjIy857GlMAohRANVGgwQFPAMJdrbzF2ZwKptx7h+s+S+++7f\nv58+ffroll1cXBg2bBimpqa0aNGCiRMncvjwYd32yMhIXnnlFTp27IiFhQUvvfQS+/fvr9Q4IyMj\nGTNmDN27d+eRRx7hjTfe4Ntvv73nPkFBQbzzzjsYGRndtc3BgwfJy8vj+eefB+4Uvq5du2JgYICi\nKBgYGPDnn3/y559/XW7u27cve/fuveex601WqhBCiIdTGgyw8fs0dsSf5pfUy7wx2p6+T3W86z6n\nTp2iS5cud91+8OBBunfvrlv+7bff9F71Z21tzcWLFys1vt9++43nnntOb98rV66Ql5dX4RuRdu3a\nhZGRES4uLvfs99tvv8Xd3R0TExO99SNGjODMmTOUlJQwduxYzMz+itfr1q0bv/766z37lcIohBCN\nQAvjZkzV2OLs8CifbTly32CAgoICWrZsWWFfaWlprFq1ilWrVunWXb9+HVNTU92yqakpN2/erNR9\nxr/v26pVKwCuXbtWrjAWFhaybNkyvvzyy3v2eePGDXbv3s3q1avLbduxYwdFRUX8+OOPlJTonz23\nbNmSgoKCe/Ytl1KFEKIR6fF423LBADG/lA8GaN26Ndeulf8+5Llz5/D392fevHk4OTnp1puYmOi1\nv3btGs2bN0eluv+bQExMTCgsLNQtl/69osK8YsUKvLy8sLKyumefP/zwA23atKFv374Vbjc2NsbT\n05OwsDDS0tL0xl1amO9GCqMQQjQyfw8G+NeWIyz4TyKR+37nlcU/sHDTRbRG7dkVd1hvv0uXLvHy\n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\nYT7slQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "dt = datetime.datetime #to track time\n",
    "\n",
    "estimators = [10, 20]\n",
    "cv_rmsle_array=[]\n",
    "t0 = dt.now()\n",
    "for i in estimators:\n",
    "    model = RandomForestRegressor(n_estimators=i, min_samples_split=10, max_features='sqrt', max_samples=0.9, random_state=42)\n",
    "    model.fit(X_train, y_train)\n",
    "    preds_cv = model.predict(X_cv)\n",
    "    cv_err = sqrt(mse(y_cv, preds_cv))\n",
    "    cv_rmsle_array.append(cv_err)\n",
    "\n",
    "    print (f'RMSLE for N={i} is {cv_err}\\t elapsed time:{dt.now() - t0}')\n",
    "\n",
    "best_N = np.argmin(cv_rmsle_array)\n",
    "\n",
    "fig, ax = plt.subplots()\n",
    "ax.plot(estimators, cv_rmsle_array)\n",
    "ax.scatter(estimators, cv_rmsle_array)\n",
    "for i, txt in enumerate(np.round(cv_rmsle_array,3)):\n",
    "    ax.annotate((estimators[i],np.round(txt,3)), (estimators[i],cv_rmsle_array[i]))\n",
    "plt.title(\"Cross Validation Error for each N\")\n",
    "plt.xlabel(\"n_estimators\")\n",
    "plt.ylabel(\"Error\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Training RandomForest Regressor with higher values of n_estimators was taking tremendous amount of time without giving any results. Due to this reason, we have trained it with less number of estimators. The above code itself took approx. 3 hrs and hence, we did not train further.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "42uDBuWuqHte"
   },
   "source": [
    "#### Training and testing using best parameters "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 357
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 1885291,
     "status": "error",
     "timestamp": 1584204419505,
     "user": {
      "displayName": "Arun Singh",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GiLB1oZWi0vJw-6NUEFnpDZhxuDlv90nmX88O0y-A=s64",
      "userId": "01425536422013553450"
     },
     "user_tz": -330
    },
    "id": "Pj3KAn8XqHtg",
    "outputId": "d820d2a8-d31d-4c7b-e16b-3bc5d2cf515c",
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "best_N = estimators[best_N]\n",
    "print('Best n_estimators: ', best_N)\n",
    "model = RandomForestRegressor(n_estimators=best_N, min_samples_split=10, max_features='sqrt', max_samples=0.9, random_state=42)\n",
    "model.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "w8V3BYaXqHtn"
   },
   "outputs": [],
   "source": [
    "# X_test = scipy.sparse.load_npz(\"test_final.npz\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 374
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 845,
     "status": "error",
     "timestamp": 1584204768954,
     "user": {
      "displayName": "Arun Singh",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GiLB1oZWi0vJw-6NUEFnpDZhxuDlv90nmX88O0y-A=s64",
      "userId": "01425536422013553450"
     },
     "user_tz": -330
    },
    "id": "KPga0r59qHtr",
    "outputId": "5431fbed-e57d-41c6-c8b7-da54819b0da8",
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "rf_preds_tr = model.predict(X_train)\n",
    "rf_preds_cv = model.predict(X_cv)\n",
    "# rf_preds_te = model.predict(X_test)\n",
    "\n",
    "print('Train RMSLE:', sqrt(mse(y_train, rf_preds_tr)))\n",
    "\n",
    "rf_rmsle = sqrt(mse(y_cv, rf_preds_cv))\n",
    "print(\"Cross validation RMSLE: \", rf_rmsle)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "cxu9IDJDqHt2"
   },
   "source": [
    "### 6.5. LightGBM Regression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "yJJikTXMqHt3"
   },
   "source": [
    "#### Hyper parameter tuning using RandomizedSearchCV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "nRny4uSDqHt4",
    "outputId": "82f9e435-d48b-4abc-d233-876907b3f547"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 3 folds for each of 10 candidates, totalling 30 fits\n",
      "[CV] colsample_bytree=0.3745401188473625, learning_rate=0.9507143064099162, max_depth=12, min_child_weight=1.5593820005455385, n_estimators=1244, num_leaves=122 \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Using backend SequentialBackend with 1 concurrent workers.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  colsample_bytree=0.3745401188473625, learning_rate=0.9507143064099162, max_depth=12, min_child_weight=1.5593820005455385, n_estimators=1244, num_leaves=122, score=(train=-0.268, test=-0.439), total= 5.4min\n",
      "[CV] colsample_bytree=0.3745401188473625, learning_rate=0.9507143064099162, max_depth=12, min_child_weight=1.5593820005455385, n_estimators=1244, num_leaves=122 \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:  5.9min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  colsample_bytree=0.3745401188473625, learning_rate=0.9507143064099162, max_depth=12, min_child_weight=1.5593820005455385, n_estimators=1244, num_leaves=122, score=(train=-0.272, test=-0.444), total= 5.6min\n",
      "[CV] colsample_bytree=0.3745401188473625, learning_rate=0.9507143064099162, max_depth=12, min_child_weight=1.5593820005455385, n_estimators=1244, num_leaves=122 \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   2 out of   2 | elapsed: 12.0min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  colsample_bytree=0.3745401188473625, learning_rate=0.9507143064099162, max_depth=12, min_child_weight=1.5593820005455385, n_estimators=1244, num_leaves=122, score=(train=-0.266, test=-0.434), total= 5.6min\n",
      "[CV] colsample_bytree=0.44583275285359114, learning_rate=0.09997491581800289, max_depth=12, min_child_weight=1.7323522915498704, n_estimators=1323, num_leaves=123 \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   3 out of   3 | elapsed: 18.2min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  colsample_bytree=0.44583275285359114, learning_rate=0.09997491581800289, max_depth=12, min_child_weight=1.7323522915498704, n_estimators=1323, num_leaves=123, score=(train=-0.313, test=-0.355), total= 7.6min\n",
      "[CV] colsample_bytree=0.44583275285359114, learning_rate=0.09997491581800289, max_depth=12, min_child_weight=1.7323522915498704, n_estimators=1323, num_leaves=123 \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   4 out of   4 | elapsed: 26.3min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  colsample_bytree=0.44583275285359114, learning_rate=0.09997491581800289, max_depth=12, min_child_weight=1.7323522915498704, n_estimators=1323, num_leaves=123, score=(train=-0.314, test=-0.354), total= 7.8min\n",
      "[CV] colsample_bytree=0.44583275285359114, learning_rate=0.09997491581800289, max_depth=12, min_child_weight=1.7323522915498704, n_estimators=1323, num_leaves=123 \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed: 34.6min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  colsample_bytree=0.44583275285359114, learning_rate=0.09997491581800289, max_depth=12, min_child_weight=1.7323522915498704, n_estimators=1323, num_leaves=123, score=(train=-0.315, test=-0.353), total= 7.7min\n",
      "[CV] colsample_bytree=0.7080725777960455, learning_rate=0.020584494295802447, max_depth=3, min_child_weight=1.4439975445336495, n_estimators=1005, num_leaves=149 \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   6 out of   6 | elapsed: 42.9min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  colsample_bytree=0.7080725777960455, learning_rate=0.020584494295802447, max_depth=3, min_child_weight=1.4439975445336495, n_estimators=1005, num_leaves=149, score=(train=-0.368, test=-0.369), total= 2.3min\n",
      "[CV] colsample_bytree=0.7080725777960455, learning_rate=0.020584494295802447, max_depth=3, min_child_weight=1.4439975445336495, n_estimators=1005, num_leaves=149 \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   7 out of   7 | elapsed: 45.4min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  colsample_bytree=0.7080725777960455, learning_rate=0.020584494295802447, max_depth=3, min_child_weight=1.4439975445336495, n_estimators=1005, num_leaves=149, score=(train=-0.368, test=-0.369), total= 2.3min\n",
      "[CV] colsample_bytree=0.7080725777960455, learning_rate=0.020584494295802447, max_depth=3, min_child_weight=1.4439975445336495, n_estimators=1005, num_leaves=149 \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   8 out of   8 | elapsed: 47.9min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  colsample_bytree=0.7080725777960455, learning_rate=0.020584494295802447, max_depth=3, min_child_weight=1.4439975445336495, n_estimators=1005, num_leaves=149, score=(train=-0.368, test=-0.368), total= 2.3min\n",
      "[CV] colsample_bytree=0.18182496720710062, learning_rate=0.18340450985343382, max_depth=13, min_child_weight=1.2233063209765618, n_estimators=452, num_leaves=108 \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   9 out of   9 | elapsed: 50.5min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  colsample_bytree=0.18182496720710062, learning_rate=0.18340450985343382, max_depth=13, min_child_weight=1.2233063209765618, n_estimators=452, num_leaves=108, score=(train=-0.329, test=-0.360), total= 2.8min\n",
      "[CV] colsample_bytree=0.18182496720710062, learning_rate=0.18340450985343382, max_depth=13, min_child_weight=1.2233063209765618, n_estimators=452, num_leaves=108 \n",
      "[CV]  colsample_bytree=0.18182496720710062, learning_rate=0.18340450985343382, max_depth=13, min_child_weight=1.2233063209765618, n_estimators=452, num_leaves=108, score=(train=-0.330, test=-0.360), total= 3.0min\n",
      "[CV] colsample_bytree=0.18182496720710062, learning_rate=0.18340450985343382, max_depth=13, min_child_weight=1.2233063209765618, n_estimators=452, num_leaves=108 \n",
      "[CV]  colsample_bytree=0.18182496720710062, learning_rate=0.18340450985343382, max_depth=13, min_child_weight=1.2233063209765618, n_estimators=452, num_leaves=108, score=(train=-0.329, test=-0.358), total= 2.9min\n",
      "[CV] colsample_bytree=0.2912291401980419, learning_rate=0.6118528947223795, max_depth=11, min_child_weight=0.09333132642723085, n_estimators=899, num_leaves=34 \n",
      "[CV]  colsample_bytree=0.2912291401980419, learning_rate=0.6118528947223795, max_depth=11, min_child_weight=0.09333132642723085, n_estimators=899, num_leaves=34, score=(train=-0.317, test=-0.372), total= 3.2min\n",
      "[CV] colsample_bytree=0.2912291401980419, learning_rate=0.6118528947223795, max_depth=11, min_child_weight=0.09333132642723085, n_estimators=899, num_leaves=34 \n",
      "[CV]  colsample_bytree=0.2912291401980419, learning_rate=0.6118528947223795, max_depth=11, min_child_weight=0.09333132642723085, n_estimators=899, num_leaves=34, score=(train=-0.320, test=-0.374), total= 3.3min\n",
      "[CV] colsample_bytree=0.2912291401980419, learning_rate=0.6118528947223795, max_depth=11, min_child_weight=0.09333132642723085, n_estimators=899, num_leaves=34 \n",
      "[CV]  colsample_bytree=0.2912291401980419, learning_rate=0.6118528947223795, max_depth=11, min_child_weight=0.09333132642723085, n_estimators=899, num_leaves=34, score=(train=-0.317, test=-0.369), total= 3.3min\n",
      "[CV] colsample_bytree=0.45606998421703593, learning_rate=0.7851759613930136, max_depth=4, min_child_weight=0.7649239825343255, n_estimators=1467, num_leaves=83 \n",
      "[CV]  colsample_bytree=0.45606998421703593, learning_rate=0.7851759613930136, max_depth=4, min_child_weight=0.7649239825343255, n_estimators=1467, num_leaves=83, score=(train=-0.337, test=-0.372), total= 2.8min\n",
      "[CV] colsample_bytree=0.45606998421703593, learning_rate=0.7851759613930136, max_depth=4, min_child_weight=0.7649239825343255, n_estimators=1467, num_leaves=83 \n",
      "[CV]  colsample_bytree=0.45606998421703593, learning_rate=0.7851759613930136, max_depth=4, min_child_weight=0.7649239825343255, n_estimators=1467, num_leaves=83, score=(train=-0.338, test=-0.372), total= 2.8min\n",
      "[CV] colsample_bytree=0.45606998421703593, learning_rate=0.7851759613930136, max_depth=4, min_child_weight=0.7649239825343255, n_estimators=1467, num_leaves=83 \n",
      "[CV]  colsample_bytree=0.45606998421703593, learning_rate=0.7851759613930136, max_depth=4, min_child_weight=0.7649239825343255, n_estimators=1467, num_leaves=83, score=(train=-0.337, test=-0.370), total= 2.9min\n",
      "[CV] colsample_bytree=0.4667628932479799, learning_rate=0.8599404067363206, max_depth=8, min_child_weight=0.34104824737458306, n_estimators=366, num_leaves=37 \n",
      "[CV]  colsample_bytree=0.4667628932479799, learning_rate=0.8599404067363206, max_depth=8, min_child_weight=0.34104824737458306, n_estimators=366, num_leaves=37, score=(train=-0.342, test=-0.380), total= 1.3min\n",
      "[CV] colsample_bytree=0.4667628932479799, learning_rate=0.8599404067363206, max_depth=8, min_child_weight=0.34104824737458306, n_estimators=366, num_leaves=37 \n",
      "[CV]  colsample_bytree=0.4667628932479799, learning_rate=0.8599404067363206, max_depth=8, min_child_weight=0.34104824737458306, n_estimators=366, num_leaves=37, score=(train=-0.348, test=-0.385), total= 1.4min\n",
      "[CV] colsample_bytree=0.4667628932479799, learning_rate=0.8599404067363206, max_depth=8, min_child_weight=0.34104824737458306, n_estimators=366, num_leaves=37 \n",
      "[CV]  colsample_bytree=0.4667628932479799, learning_rate=0.8599404067363206, max_depth=8, min_child_weight=0.34104824737458306, n_estimators=366, num_leaves=37, score=(train=-0.343, test=-0.379), total= 1.4min\n",
      "[CV] colsample_bytree=0.9488855372533332, learning_rate=0.9656320330745594, max_depth=3, min_child_weight=0.7708330050798322, n_estimators=764, num_leaves=149 \n",
      "[CV]  colsample_bytree=0.9488855372533332, learning_rate=0.9656320330745594, max_depth=3, min_child_weight=0.7708330050798322, n_estimators=764, num_leaves=149, score=(train=-0.348, test=-0.365), total= 1.5min\n",
      "[CV] colsample_bytree=0.9488855372533332, learning_rate=0.9656320330745594, max_depth=3, min_child_weight=0.7708330050798322, n_estimators=764, num_leaves=149 \n",
      "[CV]  colsample_bytree=0.9488855372533332, learning_rate=0.9656320330745594, max_depth=3, min_child_weight=0.7708330050798322, n_estimators=764, num_leaves=149, score=(train=-0.349, test=-0.365), total= 1.4min\n",
      "[CV] colsample_bytree=0.9488855372533332, learning_rate=0.9656320330745594, max_depth=3, min_child_weight=0.7708330050798322, n_estimators=764, num_leaves=149 \n",
      "[CV]  colsample_bytree=0.9488855372533332, learning_rate=0.9656320330745594, max_depth=3, min_child_weight=0.7708330050798322, n_estimators=764, num_leaves=149, score=(train=-0.349, test=-0.364), total= 1.5min\n",
      "[CV] colsample_bytree=0.6842330265121569, learning_rate=0.4401524937396013, max_depth=8, min_child_weight=1.2199933155652418, n_estimators=975, num_leaves=194 \n",
      "[CV]  colsample_bytree=0.6842330265121569, learning_rate=0.4401524937396013, max_depth=8, min_child_weight=1.2199933155652418, n_estimators=975, num_leaves=194, score=(train=-0.309, test=-0.363), total= 3.6min\n",
      "[CV] colsample_bytree=0.6842330265121569, learning_rate=0.4401524937396013, max_depth=8, min_child_weight=1.2199933155652418, n_estimators=975, num_leaves=194 \n",
      "[CV]  colsample_bytree=0.6842330265121569, learning_rate=0.4401524937396013, max_depth=8, min_child_weight=1.2199933155652418, n_estimators=975, num_leaves=194, score=(train=-0.309, test=-0.361), total= 3.5min\n",
      "[CV] colsample_bytree=0.6842330265121569, learning_rate=0.4401524937396013, max_depth=8, min_child_weight=1.2199933155652418, n_estimators=975, num_leaves=194 \n",
      "[CV]  colsample_bytree=0.6842330265121569, learning_rate=0.4401524937396013, max_depth=8, min_child_weight=1.2199933155652418, n_estimators=975, num_leaves=194, score=(train=-0.309, test=-0.361), total= 3.7min\n",
      "[CV] colsample_bytree=0.17336465350777208, learning_rate=0.3910606075732408, max_depth=3, min_child_weight=1.325044568707964, n_estimators=1225, num_leaves=153 \n",
      "[CV]  colsample_bytree=0.17336465350777208, learning_rate=0.3910606075732408, max_depth=3, min_child_weight=1.325044568707964, n_estimators=1225, num_leaves=153, score=(train=-0.353, test=-0.363), total= 1.7min\n",
      "[CV] colsample_bytree=0.17336465350777208, learning_rate=0.3910606075732408, max_depth=3, min_child_weight=1.325044568707964, n_estimators=1225, num_leaves=153 \n",
      "[CV]  colsample_bytree=0.17336465350777208, learning_rate=0.3910606075732408, max_depth=3, min_child_weight=1.325044568707964, n_estimators=1225, num_leaves=153, score=(train=-0.355, test=-0.364), total= 1.9min\n",
      "[CV] colsample_bytree=0.17336465350777208, learning_rate=0.3910606075732408, max_depth=3, min_child_weight=1.325044568707964, n_estimators=1225, num_leaves=153 \n",
      "[CV]  colsample_bytree=0.17336465350777208, learning_rate=0.3910606075732408, max_depth=3, min_child_weight=1.325044568707964, n_estimators=1225, num_leaves=153, score=(train=-0.354, test=-0.362), total= 1.9min\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done  30 out of  30 | elapsed: 107.3min finished\n"
     ]
    }
   ],
   "source": [
    "lgb_model = LGBMRegressor(subsample=0.9)\n",
    "\n",
    "params = {'learning_rate': uniform(0, 1),\n",
    "          'n_estimators': sp_randint(200, 1500),\n",
    "          'num_leaves': sp_randint(20, 200),\n",
    "          'max_depth': sp_randint(2, 15),\n",
    "          'min_child_weight': uniform(0, 2),\n",
    "          'colsample_bytree': uniform(0, 1),\n",
    "         }\n",
    "lgb_random = RandomizedSearchCV(lgb_model, param_distributions=params, n_iter=10, cv=3, random_state=42, \n",
    "                                scoring='neg_root_mean_squared_error', verbose=10, return_train_score=True)\n",
    "lgb_random = lgb_random.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "E91wPSoYqHuB",
    "outputId": "fa550948-cac0-4d2f-8faa-a028362e44b6"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>param_learning_rate</th>\n",
       "      <th>param_n_estimators</th>\n",
       "      <th>param_num_leaves</th>\n",
       "      <th>param_max_depth</th>\n",
       "      <th>param_min_child_weight</th>\n",
       "      <th>param_colsample_bytree</th>\n",
       "      <th>mean_train_score</th>\n",
       "      <th>mean_test_score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.950714</td>\n",
       "      <td>1244</td>\n",
       "      <td>122</td>\n",
       "      <td>12</td>\n",
       "      <td>1.55938</td>\n",
       "      <td>0.37454</td>\n",
       "      <td>-0.268712</td>\n",
       "      <td>-0.438865</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.0999749</td>\n",
       "      <td>1323</td>\n",
       "      <td>123</td>\n",
       "      <td>12</td>\n",
       "      <td>1.73235</td>\n",
       "      <td>0.445833</td>\n",
       "      <td>-0.313804</td>\n",
       "      <td>-0.354006</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.0205845</td>\n",
       "      <td>1005</td>\n",
       "      <td>149</td>\n",
       "      <td>3</td>\n",
       "      <td>1.444</td>\n",
       "      <td>0.708073</td>\n",
       "      <td>-0.368029</td>\n",
       "      <td>-0.368651</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.183405</td>\n",
       "      <td>452</td>\n",
       "      <td>108</td>\n",
       "      <td>13</td>\n",
       "      <td>1.22331</td>\n",
       "      <td>0.181825</td>\n",
       "      <td>-0.329229</td>\n",
       "      <td>-0.359530</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.611853</td>\n",
       "      <td>899</td>\n",
       "      <td>34</td>\n",
       "      <td>11</td>\n",
       "      <td>0.0933313</td>\n",
       "      <td>0.291229</td>\n",
       "      <td>-0.318427</td>\n",
       "      <td>-0.371338</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>0.785176</td>\n",
       "      <td>1467</td>\n",
       "      <td>83</td>\n",
       "      <td>4</td>\n",
       "      <td>0.764924</td>\n",
       "      <td>0.45607</td>\n",
       "      <td>-0.337573</td>\n",
       "      <td>-0.371254</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>0.85994</td>\n",
       "      <td>366</td>\n",
       "      <td>37</td>\n",
       "      <td>8</td>\n",
       "      <td>0.341048</td>\n",
       "      <td>0.466763</td>\n",
       "      <td>-0.344313</td>\n",
       "      <td>-0.380979</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>0.965632</td>\n",
       "      <td>764</td>\n",
       "      <td>149</td>\n",
       "      <td>3</td>\n",
       "      <td>0.770833</td>\n",
       "      <td>0.948886</td>\n",
       "      <td>-0.348773</td>\n",
       "      <td>-0.364846</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>0.440152</td>\n",
       "      <td>975</td>\n",
       "      <td>194</td>\n",
       "      <td>8</td>\n",
       "      <td>1.21999</td>\n",
       "      <td>0.684233</td>\n",
       "      <td>-0.308797</td>\n",
       "      <td>-0.361790</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>0.391061</td>\n",
       "      <td>1225</td>\n",
       "      <td>153</td>\n",
       "      <td>3</td>\n",
       "      <td>1.32504</td>\n",
       "      <td>0.173365</td>\n",
       "      <td>-0.353940</td>\n",
       "      <td>-0.362636</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "  param_learning_rate param_n_estimators param_num_leaves param_max_depth  \\\n",
       "0            0.950714               1244              122              12   \n",
       "1           0.0999749               1323              123              12   \n",
       "2           0.0205845               1005              149               3   \n",
       "3            0.183405                452              108              13   \n",
       "4            0.611853                899               34              11   \n",
       "5            0.785176               1467               83               4   \n",
       "6             0.85994                366               37               8   \n",
       "7            0.965632                764              149               3   \n",
       "8            0.440152                975              194               8   \n",
       "9            0.391061               1225              153               3   \n",
       "\n",
       "  param_min_child_weight param_colsample_bytree  mean_train_score  \\\n",
       "0                1.55938                0.37454         -0.268712   \n",
       "1                1.73235               0.445833         -0.313804   \n",
       "2                  1.444               0.708073         -0.368029   \n",
       "3                1.22331               0.181825         -0.329229   \n",
       "4              0.0933313               0.291229         -0.318427   \n",
       "5               0.764924                0.45607         -0.337573   \n",
       "6               0.341048               0.466763         -0.344313   \n",
       "7               0.770833               0.948886         -0.348773   \n",
       "8                1.21999               0.684233         -0.308797   \n",
       "9                1.32504               0.173365         -0.353940   \n",
       "\n",
       "   mean_test_score  \n",
       "0        -0.438865  \n",
       "1        -0.354006  \n",
       "2        -0.368651  \n",
       "3        -0.359530  \n",
       "4        -0.371338  \n",
       "5        -0.371254  \n",
       "6        -0.380979  \n",
       "7        -0.364846  \n",
       "8        -0.361790  \n",
       "9        -0.362636  "
      ]
     },
     "execution_count": 5,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1 = pd.DataFrame(lgb_random.cv_results_)\n",
    "df1[['param_learning_rate', 'param_n_estimators', 'param_num_leaves', 'param_max_depth', 'param_min_child_weight', 'param_colsample_bytree', 'mean_train_score', 'mean_test_score']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "YekBUdP9qHuF",
    "outputId": "8e089299-7358-452e-adf1-456123db36e6"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'colsample_bytree': 0.44583275285359114, 'learning_rate': 0.09997491581800289, 'max_depth': 12, 'min_child_weight': 1.7323522915498704, 'n_estimators': 1323, 'num_leaves': 123}\n"
     ]
    }
   ],
   "source": [
    "best_params = lgb_random.best_params_\n",
    "print(best_params)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "LltDSSWNqHuJ"
   },
   "source": [
    "#### Training and testing using best parameters "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "ywxA4pCbqHuL",
    "outputId": "85b85d12-49f4-44ba-f901-529b32f7a98a"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LGBMRegressor(boosting_type='gbdt', class_weight=None,\n",
       "              colsample_bytree=0.44583275285359114, importance_type='split',\n",
       "              learning_rate=0.09997491581800289, max_depth=12,\n",
       "              min_child_samples=20, min_child_weight=1.7323522915498704,\n",
       "              min_split_gain=0.0, n_estimators=1323, n_jobs=-1, num_leaves=123,\n",
       "              objective=None, random_state=42, reg_alpha=0.0, reg_lambda=0.0,\n",
       "              silent=True, subsample=0.9, subsample_for_bin=200000,\n",
       "              subsample_freq=0)"
      ]
     },
     "execution_count": 7,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = LGBMRegressor(**best_params, subsample=0.9, random_state=42, n_jobs=-1)\n",
    "model.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "Eipyf4VIqHuP"
   },
   "outputs": [],
   "source": [
    "X_cv = scipy.sparse.load_npz(\"cv_final.npz\")\n",
    "y_cv = np.load('y_cv.npy')\n",
    "\n",
    "X_test = scipy.sparse.load_npz(\"test_final.npz\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "KAv4add1qHuT",
    "outputId": "d97e8cd7-6a8e-44c5-8d3d-07b5ff96e8c7"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train RMSLE: 0.3197898252767807\n",
      "Cross validation RMSLE:  0.42423139030835477\n"
     ]
    }
   ],
   "source": [
    "lgb_preds_tr = model.predict(X_train)\n",
    "lgb_preds_cv = model.predict(X_cv)\n",
    "lgb_preds_te = model.predict(X_test)\n",
    "\n",
    "print('Train RMSLE:', sqrt(mse(y_train, lgb_preds_tr)))\n",
    "\n",
    "lgb_rmsle = sqrt(mse(y_cv, lgb_preds_cv))\n",
    "print(\"Cross validation RMSLE: \", lgb_rmsle)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "SXMJOl8QqHuY"
   },
   "source": [
    "**Creating submission file**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 0,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "9TNENQl0qHuZ"
   },
   "outputs": [],
   "source": [
    "submission_df = pd.read_csv('ridge_submission.csv')\n",
    "\n",
    "submission_df['price'] = np.exp(lgb_preds_te) - 1\n",
    "\n",
    "submission_df.to_csv('lgb_submission.csv', index=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "5FkQ4Q9aqHud"
   },
   "source": [
    "## Summary"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "miqqsp38qHue",
    "outputId": "12692547-dadc-49cd-f6d3-4ae27f1db0f2"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "+----------+--------------------------------------------+-------------+------------------+----------------------+\n",
      "|  Model   |               Feature Space                | Train_RMSLE | Validation_RMSLE | Kaggle_RMSLE(Public) |\n",
      "+----------+--------------------------------------------+-------------+------------------+----------------------+\n",
      "|  Ridge   |     FeatureEngg + cat_OHE + text_TFIDF     |   0.38345   |     0.44153      |       0.45444        |\n",
      "|   SVR    | 48Kbest text&cat + Ridge Preds + MNB Preds |   0.44156   |     0.45764      |          -           |\n",
      "| LightGBM | 48Kbest text&cat + Ridge Preds + MNB Preds |   0.31979   |     0.42423      |       0.45823        |\n",
      "+----------+--------------------------------------------+-------------+------------------+----------------------+\n"
     ]
    }
   ],
   "source": [
    "from prettytable import PrettyTable\n",
    "x=PrettyTable()\n",
    "x.field_names=[\"Model\", \"Feature Space\", \"Train_RMSLE\", \"Validation_RMSLE\", \"Kaggle_RMSLE(Public)\"]\n",
    "x.add_row([\"Ridge\", \"FeatureEngg + cat_OHE + text_TFIDF\", \"0.38345\", \"0.44153\", \"0.45444\"])\n",
    "x.add_row([\"SVR\", \"48Kbest text&cat + Ridge Preds + MNB Preds\", \"0.44156\", \"0.45764\", \"-\"])\n",
    "x.add_row([\"LightGBM\", \"48Kbest text&cat + Ridge Preds + MNB Preds\", \"0.31979\", \"0.42423\", \"0.45823\"])\n",
    "\n",
    "print(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- **We are able to get pretty decent results with ML models with feature engineering and standard text vectorization.**\n",
    "\n",
    "- **In order to get more accurate predictions, we should try Deep Learning models.**"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "name": "Mercari_advModel.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
